library(tidyverse)
Warning: package ‘tidyverse’ was built under R version 4.2.3Warning: package ‘ggplot2’ was built under R version 4.2.3Warning: package ‘tibble’ was built under R version 4.2.3Warning: package ‘tidyr’ was built under R version 4.2.3Warning: package ‘readr’ was built under R version 4.2.3Warning: package ‘purrr’ was built under R version 4.2.3Warning: package ‘dplyr’ was built under R version 4.2.3Warning: package ‘forcats’ was built under R version 4.2.3Warning: package ‘lubridate’ was built under R version 4.2.3── Attaching core tidyverse packages ──────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.2 ✔ readr 2.1.4
✔ forcats 1.0.0 ✔ stringr 1.5.0
✔ ggplot2 3.4.2 ✔ tibble 3.2.1
✔ lubridate 1.9.2 ✔ tidyr 1.3.0
✔ purrr 1.0.1 ── Conflicts ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(CodeClanData)
Attaching package: ‘CodeClanData’
The following object is masked from ‘package:dplyr’:
starwars
The following object is masked from ‘package:tidyr’:
population
library(plotly)
Warning: package ‘plotly’ was built under R version 4.2.3
Attaching package: ‘plotly’
The following object is masked from ‘package:ggplot2’:
last_plot
The following object is masked from ‘package:stats’:
filter
The following object is masked from ‘package:graphics’:
layout
game_sales
game_sales %>%
group_by(publisher, year_of_release) %>%
summarise(num_games_released = n()) %>%
plot_ly(x = ~ year_of_release,
y = ~ num_games_released,
color = ~ publisher,
mode = "lines",
text = ~ publisher,
hovertemplate = '<b>%{text}',
showlegend = F) %>%
highlight(on = "plotly_hover")
`summarise()` has grouped output by 'publisher'. You can override using the `.groups` argument.No trace type specified:
Based on info supplied, a 'scatter' trace seems appropriate.
Read more about this trace type -> https://plotly.com/r/reference/#scatter
Warning: n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors
Warning: n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors
No trace type specified:
Based on info supplied, a 'scatter' trace seems appropriate.
Read more about this trace type -> https://plotly.com/r/reference/#scatter
Warning: n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors
Warning: n too large, allowed maximum for palette Set2 is 8
Returning the palette you asked for with that many colors
game_sales %>%
group_by(publisher) %>%
summarise(avg_rating = mean(user_score)) %>%
ggplot(aes(reorder(publisher, avg_rating), avg_rating)) +
geom_col() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))


game_sales %>%
filter(publisher == "Nintendo") %>%
group_by(name) %>%
summarise(user_score = mean(user_score),
critic_score = mean(critic_score)/10) %>%
arrange(desc(user_score)) %>%
slice_head(n = 10) %>%
pivot_longer(user_score:critic_score, names_to = "reviewer", values_to = "score") %>%
ggplot() +
geom_col(aes(x = reorder(name, -score), y = score, fill = reviewer),
position = "dodge",
#fill = "lavenderblush2"
) +
# geom_point(aes(x = name, y = critic_score),
# #position = "dodge",
# colour = "deeppink2") +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
panel.grid = element_blank()) +
labs(
title = "Top 10 Games Released by Selected Publisher",
x = "",
y = "Rating"
)


game_sales %>%
group_by(publisher, platform) %>%
summarise(total_games = n()) %>%
ggplot(aes(publisher, total_games, fill = platform)) +
geom_col() +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
`summarise()` has grouped output by 'publisher'. You can override using the `.groups` argument.

game_sales <- game_sales %>%
mutate(platform_cat = case_when(
str_detect(platform, "PS") ~ "Playstation",
str_detect(platform, "X") ~ "Xbox",
str_detect(platform, "Wii") ~ "Nintendo Wii",
str_detect(platform, "GC") ~ "Nintendo Gamecube",
str_detect(platform, "GB") ~ "Nintendo Game Boy",
str_detect(platform, "DS") ~ "Nintendo DS",
.default = platform
))
game_sales %>%
group_by(publisher, platform_cat) %>%
summarise(total_games = n()) %>%
ggplot(aes(reorder(publisher, -total_games, sum), total_games, fill = platform_cat)) +
geom_col() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
scale_fill_manual(values = c(
"Xbox" = "darkgreen",
"Playstation" = "blue",
"Nintendo Gamecube" = "red1",
"Nintendo DS" = "red2",
"Nintendo Wii" = "red3",
"Nintendo Game Boy" = "red4",
"PC" = "black")
)
`summarise()` has grouped output by 'publisher'. You can override using the `.groups` argument.

Games by publisher
colour_scheme <- c(
"Xbox" = "darkgreen",
"Playstation" = "blue",
"Nintendo Gamecube" = "red1",
"Nintendo DS" = "red2",
"Nintendo Wii" = "red3",
"Nintendo Game Boy" = "red4",
"PC" = "black")
game_sales %>%
group_by(publisher, platform_cat) %>%
summarise(total_games = n()) %>%
plot_ly(y = ~ reorder(publisher, total_games, sum),
x = ~ total_games,
color = ~ platform_cat,
colors = colour_scheme,
type = "bar"
) %>%
layout(barmode = "stack",
title = "Number of Games Released by Publisher Across Each Platform",
yaxis = list(title = ""),
xaxis = list(title = "Number of Games released")
)
`summarise()` has grouped output by 'publisher'. You can override using the `.groups` argument.

game_sales <- game_sales %>%
mutate(
platform_cat = factor(
case_when(
str_detect(platform, "PS") ~ "Playstation",
str_detect(platform, "X") ~ "Xbox",
str_detect(platform, "Wii|GC|GB|DS") ~ "Nintendo",
.default = platform
)
)
)
game_sales %>%
filter(publisher == "Activision") %>%
group_by(year_of_release, platform_cat, .drop = FALSE) %>%
summarise(total_games_plat = n()) %>%
ungroup() %>%
group_by(year_of_release) %>%
mutate(total_games = sum(total_games_plat)) %>%
ggplot() +
geom_line(aes(year_of_release, total_games_plat, colour = platform_cat)) +
geom_point(aes(year_of_release, total_games_plat, colour = platform_cat))+
geom_line(aes(year_of_release, total_games, colour = "Total")) +
geom_point(aes(year_of_release, total_games, colour = "Total"))
`summarise()` has grouped output by 'year_of_release'. You can override using the `.groups` argument.

theme_classic()
List of 97
$ line :List of 6
..$ colour : chr "black"
..$ linewidth : num 0.5
..$ linetype : num 1
..$ lineend : chr "butt"
..$ arrow : logi FALSE
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_line" "element"
$ rect :List of 5
..$ fill : chr "white"
..$ colour : chr "black"
..$ linewidth : num 0.5
..$ linetype : num 1
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_rect" "element"
$ text :List of 11
..$ family : chr ""
..$ face : chr "plain"
..$ colour : chr "black"
..$ size : num 11
..$ hjust : num 0.5
..$ vjust : num 0.5
..$ angle : num 0
..$ lineheight : num 0.9
..$ margin : 'margin' num [1:4] 0points 0points 0points 0points
.. ..- attr(*, "unit")= int 8
..$ debug : logi FALSE
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_text" "element"
$ title : NULL
$ aspect.ratio : NULL
$ axis.title : NULL
$ axis.title.x :List of 11
..$ family : NULL
..$ face : NULL
..$ colour : NULL
..$ size : NULL
..$ hjust : NULL
..$ vjust : num 1
..$ angle : NULL
..$ lineheight : NULL
..$ margin : 'margin' num [1:4] 2.75points 0points 0points 0points
.. ..- attr(*, "unit")= int 8
..$ debug : NULL
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_text" "element"
$ axis.title.x.top :List of 11
..$ family : NULL
..$ face : NULL
..$ colour : NULL
..$ size : NULL
..$ hjust : NULL
..$ vjust : num 0
..$ angle : NULL
..$ lineheight : NULL
..$ margin : 'margin' num [1:4] 0points 0points 2.75points 0points
.. ..- attr(*, "unit")= int 8
..$ debug : NULL
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_text" "element"
$ axis.title.x.bottom : NULL
$ axis.title.y :List of 11
..$ family : NULL
..$ face : NULL
..$ colour : NULL
..$ size : NULL
..$ hjust : NULL
..$ vjust : num 1
..$ angle : num 90
..$ lineheight : NULL
..$ margin : 'margin' num [1:4] 0points 2.75points 0points 0points
.. ..- attr(*, "unit")= int 8
..$ debug : NULL
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_text" "element"
$ axis.title.y.left : NULL
$ axis.title.y.right :List of 11
..$ family : NULL
..$ face : NULL
..$ colour : NULL
..$ size : NULL
..$ hjust : NULL
..$ vjust : num 0
..$ angle : num -90
..$ lineheight : NULL
..$ margin : 'margin' num [1:4] 0points 0points 0points 2.75points
.. ..- attr(*, "unit")= int 8
..$ debug : NULL
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_text" "element"
$ axis.text :List of 11
..$ family : NULL
..$ face : NULL
..$ colour : chr "grey30"
..$ size : 'rel' num 0.8
..$ hjust : NULL
..$ vjust : NULL
..$ angle : NULL
..$ lineheight : NULL
..$ margin : NULL
..$ debug : NULL
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_text" "element"
$ axis.text.x :List of 11
..$ family : NULL
..$ face : NULL
..$ colour : NULL
..$ size : NULL
..$ hjust : NULL
..$ vjust : num 1
..$ angle : NULL
..$ lineheight : NULL
..$ margin : 'margin' num [1:4] 2.2points 0points 0points 0points
.. ..- attr(*, "unit")= int 8
..$ debug : NULL
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_text" "element"
$ axis.text.x.top :List of 11
..$ family : NULL
..$ face : NULL
..$ colour : NULL
..$ size : NULL
..$ hjust : NULL
..$ vjust : num 0
..$ angle : NULL
..$ lineheight : NULL
..$ margin : 'margin' num [1:4] 0points 0points 2.2points 0points
.. ..- attr(*, "unit")= int 8
..$ debug : NULL
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_text" "element"
$ axis.text.x.bottom : NULL
$ axis.text.y :List of 11
..$ family : NULL
..$ face : NULL
..$ colour : NULL
..$ size : NULL
..$ hjust : num 1
..$ vjust : NULL
..$ angle : NULL
..$ lineheight : NULL
..$ margin : 'margin' num [1:4] 0points 2.2points 0points 0points
.. ..- attr(*, "unit")= int 8
..$ debug : NULL
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_text" "element"
$ axis.text.y.left : NULL
$ axis.text.y.right :List of 11
..$ family : NULL
..$ face : NULL
..$ colour : NULL
..$ size : NULL
..$ hjust : num 0
..$ vjust : NULL
..$ angle : NULL
..$ lineheight : NULL
..$ margin : 'margin' num [1:4] 0points 0points 0points 2.2points
.. ..- attr(*, "unit")= int 8
..$ debug : NULL
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_text" "element"
$ axis.ticks :List of 6
..$ colour : chr "grey20"
..$ linewidth : NULL
..$ linetype : NULL
..$ lineend : NULL
..$ arrow : logi FALSE
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_line" "element"
$ axis.ticks.x : NULL
$ axis.ticks.x.top : NULL
$ axis.ticks.x.bottom : NULL
$ axis.ticks.y : NULL
$ axis.ticks.y.left : NULL
$ axis.ticks.y.right : NULL
$ axis.ticks.length : 'simpleUnit' num 2.75points
..- attr(*, "unit")= int 8
$ axis.ticks.length.x : NULL
$ axis.ticks.length.x.top : NULL
$ axis.ticks.length.x.bottom: NULL
$ axis.ticks.length.y : NULL
$ axis.ticks.length.y.left : NULL
$ axis.ticks.length.y.right : NULL
$ axis.line :List of 6
..$ colour : chr "black"
..$ linewidth : 'rel' num 1
..$ linetype : NULL
..$ lineend : NULL
..$ arrow : logi FALSE
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_line" "element"
$ axis.line.x : NULL
$ axis.line.x.top : NULL
$ axis.line.x.bottom : NULL
$ axis.line.y : NULL
$ axis.line.y.left : NULL
$ axis.line.y.right : NULL
$ legend.background :List of 5
..$ fill : NULL
..$ colour : logi NA
..$ linewidth : NULL
..$ linetype : NULL
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_rect" "element"
$ legend.margin : 'margin' num [1:4] 5.5points 5.5points 5.5points 5.5points
..- attr(*, "unit")= int 8
$ legend.spacing : 'simpleUnit' num 11points
..- attr(*, "unit")= int 8
$ legend.spacing.x : NULL
$ legend.spacing.y : NULL
$ legend.key : list()
..- attr(*, "class")= chr [1:2] "element_blank" "element"
$ legend.key.size : 'simpleUnit' num 1.2lines
..- attr(*, "unit")= int 3
$ legend.key.height : NULL
$ legend.key.width : NULL
$ legend.text :List of 11
..$ family : NULL
..$ face : NULL
..$ colour : NULL
..$ size : 'rel' num 0.8
..$ hjust : NULL
..$ vjust : NULL
..$ angle : NULL
..$ lineheight : NULL
..$ margin : NULL
..$ debug : NULL
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_text" "element"
$ legend.text.align : NULL
$ legend.title :List of 11
..$ family : NULL
..$ face : NULL
..$ colour : NULL
..$ size : NULL
..$ hjust : num 0
..$ vjust : NULL
..$ angle : NULL
..$ lineheight : NULL
..$ margin : NULL
..$ debug : NULL
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_text" "element"
$ legend.title.align : NULL
$ legend.position : chr "right"
$ legend.direction : NULL
$ legend.justification : chr "center"
$ legend.box : NULL
$ legend.box.just : NULL
$ legend.box.margin : 'margin' num [1:4] 0cm 0cm 0cm 0cm
..- attr(*, "unit")= int 1
$ legend.box.background : list()
..- attr(*, "class")= chr [1:2] "element_blank" "element"
$ legend.box.spacing : 'simpleUnit' num 11points
..- attr(*, "unit")= int 8
$ panel.background :List of 5
..$ fill : chr "white"
..$ colour : logi NA
..$ linewidth : NULL
..$ linetype : NULL
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_rect" "element"
$ panel.border : list()
..- attr(*, "class")= chr [1:2] "element_blank" "element"
$ panel.spacing : 'simpleUnit' num 5.5points
..- attr(*, "unit")= int 8
$ panel.spacing.x : NULL
$ panel.spacing.y : NULL
$ panel.grid :List of 6
..$ colour : chr "grey92"
..$ linewidth : NULL
..$ linetype : NULL
..$ lineend : NULL
..$ arrow : logi FALSE
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_line" "element"
$ panel.grid.major : list()
..- attr(*, "class")= chr [1:2] "element_blank" "element"
$ panel.grid.minor : list()
..- attr(*, "class")= chr [1:2] "element_blank" "element"
$ panel.grid.major.x : NULL
$ panel.grid.major.y : NULL
$ panel.grid.minor.x : NULL
$ panel.grid.minor.y : NULL
$ panel.ontop : logi FALSE
$ plot.background :List of 5
..$ fill : NULL
..$ colour : chr "white"
..$ linewidth : NULL
..$ linetype : NULL
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_rect" "element"
$ plot.title :List of 11
..$ family : NULL
..$ face : NULL
..$ colour : NULL
..$ size : 'rel' num 1.2
..$ hjust : num 0
..$ vjust : num 1
..$ angle : NULL
..$ lineheight : NULL
..$ margin : 'margin' num [1:4] 0points 0points 5.5points 0points
.. ..- attr(*, "unit")= int 8
..$ debug : NULL
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_text" "element"
$ plot.title.position : chr "panel"
$ plot.subtitle :List of 11
..$ family : NULL
..$ face : NULL
..$ colour : NULL
..$ size : NULL
..$ hjust : num 0
..$ vjust : num 1
..$ angle : NULL
..$ lineheight : NULL
..$ margin : 'margin' num [1:4] 0points 0points 5.5points 0points
.. ..- attr(*, "unit")= int 8
..$ debug : NULL
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_text" "element"
$ plot.caption :List of 11
..$ family : NULL
..$ face : NULL
..$ colour : NULL
..$ size : 'rel' num 0.8
..$ hjust : num 1
..$ vjust : num 1
..$ angle : NULL
..$ lineheight : NULL
..$ margin : 'margin' num [1:4] 5.5points 0points 0points 0points
.. ..- attr(*, "unit")= int 8
..$ debug : NULL
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_text" "element"
$ plot.caption.position : chr "panel"
$ plot.tag :List of 11
..$ family : NULL
..$ face : NULL
..$ colour : NULL
..$ size : 'rel' num 1.2
..$ hjust : num 0.5
..$ vjust : num 0.5
..$ angle : NULL
..$ lineheight : NULL
..$ margin : NULL
..$ debug : NULL
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_text" "element"
$ plot.tag.position : chr "topleft"
$ plot.margin : 'margin' num [1:4] 5.5points 5.5points 5.5points 5.5points
..- attr(*, "unit")= int 8
$ strip.background :List of 5
..$ fill : chr "white"
..$ colour : chr "black"
..$ linewidth : 'rel' num 2
..$ linetype : NULL
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_rect" "element"
$ strip.background.x : NULL
$ strip.background.y : NULL
$ strip.clip : chr "inherit"
$ strip.placement : chr "inside"
$ strip.text :List of 11
..$ family : NULL
..$ face : NULL
..$ colour : chr "grey10"
..$ size : 'rel' num 0.8
..$ hjust : NULL
..$ vjust : NULL
..$ angle : NULL
..$ lineheight : NULL
..$ margin : 'margin' num [1:4] 4.4points 4.4points 4.4points 4.4points
.. ..- attr(*, "unit")= int 8
..$ debug : NULL
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_text" "element"
$ strip.text.x : NULL
$ strip.text.x.bottom : NULL
$ strip.text.x.top : NULL
$ strip.text.y :List of 11
..$ family : NULL
..$ face : NULL
..$ colour : NULL
..$ size : NULL
..$ hjust : NULL
..$ vjust : NULL
..$ angle : num -90
..$ lineheight : NULL
..$ margin : NULL
..$ debug : NULL
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_text" "element"
$ strip.text.y.left :List of 11
..$ family : NULL
..$ face : NULL
..$ colour : NULL
..$ size : NULL
..$ hjust : NULL
..$ vjust : NULL
..$ angle : num 90
..$ lineheight : NULL
..$ margin : NULL
..$ debug : NULL
..$ inherit.blank: logi TRUE
..- attr(*, "class")= chr [1:2] "element_text" "element"
$ strip.text.y.right : NULL
$ strip.switch.pad.grid : 'simpleUnit' num 2.75points
..- attr(*, "unit")= int 8
$ strip.switch.pad.wrap : 'simpleUnit' num 2.75points
..- attr(*, "unit")= int 8
- attr(*, "class")= chr [1:2] "theme" "gg"
- attr(*, "complete")= logi TRUE
- attr(*, "validate")= logi TRUE
game_sales %>%
group_by(platform_cat, platform) %>%
summarise(total = n()) %>%
ggplot(aes(platform_cat, total, fill = platform)) +
geom_col() +
geom_text(aes(label = platform))
`summarise()` has grouped output by 'platform_cat'. You can override using the `.groups` argument.

LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShDb2RlQ2xhbkRhdGEpDQpsaWJyYXJ5KHBsb3RseSkNCg0KZ2FtZV9zYWxlcw0KYGBgDQoNCmBgYHtyfQ0KZ2FtZV9zYWxlcyAlPiUgDQogIGdyb3VwX2J5KHB1Ymxpc2hlciwgeWVhcl9vZl9yZWxlYXNlKSAlPiUgDQogIHN1bW1hcmlzZShudW1fZ2FtZXNfcmVsZWFzZWQgPSBuKCkpICU+JSANCiAgcGxvdF9seSh4ID0gfiB5ZWFyX29mX3JlbGVhc2UsDQogICAgICAgICAgeSA9IH4gbnVtX2dhbWVzX3JlbGVhc2VkLA0KICAgICAgICAgIGNvbG9yID0gfiBwdWJsaXNoZXIsDQogICAgICAgICAgbW9kZSA9ICJsaW5lcyIsIA0KICAgICAgICAgIHRleHQgPSB+IHB1Ymxpc2hlciwNCiAgICAgICAgICBob3ZlcnRlbXBsYXRlID0gJzxiPiV7dGV4dH0nLA0KICAgICAgICAgIHNob3dsZWdlbmQgPSBGKSAlPiUgDQogIGhpZ2hsaWdodChvbiA9ICJwbG90bHlfaG92ZXIiKQ0KYGBgDQoNCmBgYHtyfQ0KZ2FtZV9zYWxlcyAlPiUgDQogIGdyb3VwX2J5KHB1Ymxpc2hlcikgJT4lIA0KICBzdW1tYXJpc2UoYXZnX3JhdGluZyA9IG1lYW4odXNlcl9zY29yZSkpICU+JSANCiAgZ2dwbG90KGFlcyhyZW9yZGVyKHB1Ymxpc2hlciwgLWF2Z19yYXRpbmcpLCBhdmdfcmF0aW5nKSkgKw0KICBnZW9tX2NvbCgpICsNCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkNCmBgYA0KDQpgYGB7cn0NCmdhbWVfc2FsZXMgJT4lIA0KICBmaWx0ZXIocHVibGlzaGVyID09ICJBY3RpdmlzaW9uIikgJT4lIA0KICBncm91cF9ieShuYW1lKSAlPiUgDQogIHN1bW1hcmlzZSh1c2VyX3Njb3JlID0gbWVhbih1c2VyX3Njb3JlKSwNCiAgICAgICAgICAgIGNyaXRpY19zY29yZSA9IG1lYW4oY3JpdGljX3Njb3JlKS8xMCkgJT4lIA0KICBhcnJhbmdlKGRlc2ModXNlcl9zY29yZSkpICU+JSANCiAgc2xpY2VfaGVhZChuID0gMTApICU+JSANCiAgZ2dwbG90KCkgKw0KICBnZW9tX2NvbChhZXMoeCA9IHJlb3JkZXIobmFtZSwgdXNlcl9zY29yZSksIHkgPSB1c2VyX3Njb3JlKSwgcG9zaXRpb24gPSAiZG9kZ2UiLCBmaWxsID0gImRhcmtvbGl2ZWdyZWVuNCIpICsNCiAgZ2VvbV9wb2ludChhZXMoeCA9IG5hbWUsIHkgPSBjcml0aWNfc2NvcmUpLCBwb3NpdGlvbiA9ICJkb2RnZSIsIGNvbG91ciA9ICJicm93bjQiKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCg0KYGBge3J9DQpnYW1lX3NhbGVzICU+JSANCiAgZmlsdGVyKHB1Ymxpc2hlciA9PSAiTmludGVuZG8iKSAlPiUgDQogIGdyb3VwX2J5KG5hbWUpICU+JSANCiAgc3VtbWFyaXNlKHVzZXJfc2NvcmUgPSBtZWFuKHVzZXJfc2NvcmUpLA0KICAgICAgICAgICAgY3JpdGljX3Njb3JlID0gbWVhbihjcml0aWNfc2NvcmUpLzEwKSAlPiUgDQogIGFycmFuZ2UoZGVzYyh1c2VyX3Njb3JlKSkgJT4lIA0KICBzbGljZV9oZWFkKG4gPSAxMCkgJT4lIA0KICBwaXZvdF9sb25nZXIodXNlcl9zY29yZTpjcml0aWNfc2NvcmUsIG5hbWVzX3RvID0gIlJldmlld2VyIiwgdmFsdWVzX3RvID0gInNjb3JlIikgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21fY29sKGFlcyh4ID0gcmVvcmRlcihuYW1lLCAtc2NvcmUpLCB5ID0gc2NvcmUsIGZpbGwgPSBSZXZpZXdlciksDQogICAgICAgICAgIHBvc2l0aW9uID0gImRvZGdlIiwNCiAgICAgICAgICAgI2ZpbGwgPSAibGF2ZW5kZXJibHVzaDIiDQogICkgKw0KICAjIGdlb21fcG9pbnQoYWVzKHggPSBuYW1lLCB5ID0gY3JpdGljX3Njb3JlKSwNCiAgIyAgICAgICAgICAgICNwb3NpdGlvbiA9ICJkb2RnZSIsDQogICMgICAgICAgICAgICBjb2xvdXIgPSAiZGVlcHBpbmsyIikgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLA0KICAgICAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKSArDQogIGxhYnMoDQogICAgdGl0bGUgPSAiVG9wIDEwIEdhbWVzIFJlbGVhc2VkIGJ5IFNlbGVjdGVkIFB1Ymxpc2hlciIsDQogICAgeCA9ICIiLA0KICAgIHkgPSAiUmF0aW5nIg0KICApDQpgYGANCg0KDQoNCg0KYGBge3J9DQpnYW1lX3NhbGVzICU+JSANCiAgZ3JvdXBfYnkocHVibGlzaGVyKSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9nYW1lcyA9IG4oKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHJlb3JkZXIocHVibGlzaGVyLCAtdG90YWxfZ2FtZXMpLCB0b3RhbF9nYW1lcykpICsNCiAgZ2VvbV9jb2woKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSkpDQpgYGANCg0KYGBge3J9DQpnYW1lX3NhbGVzICU+JSANCiAgZ3JvdXBfYnkocHVibGlzaGVyLCBwbGF0Zm9ybSkgJT4lIA0KICBzdW1tYXJpc2UodG90YWxfZ2FtZXMgPSBuKCkpICU+JSANCiAgZ2dwbG90KGFlcyhwdWJsaXNoZXIsIHRvdGFsX2dhbWVzLCBmaWxsID0gcGxhdGZvcm0pKSArDQogIGdlb21fY29sKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQ0KYGBgDQoNCmBgYHtyfQ0KZ2FtZV9zYWxlcyA8LSBnYW1lX3NhbGVzICU+JSANCiAgbXV0YXRlKHBsYXRmb3JtX2NhdCA9IGNhc2Vfd2hlbigNCiAgICBzdHJfZGV0ZWN0KHBsYXRmb3JtLCAiUFMiKSB+ICJQbGF5c3RhdGlvbiIsDQogICAgc3RyX2RldGVjdChwbGF0Zm9ybSwgIlgiKSB+ICJYYm94IiwNCiAgICBzdHJfZGV0ZWN0KHBsYXRmb3JtLCAiV2lpIikgfiAiTmludGVuZG8gV2lpIiwNCiAgICBzdHJfZGV0ZWN0KHBsYXRmb3JtLCAiR0MiKSB+ICJOaW50ZW5kbyBHYW1lY3ViZSIsDQogICAgc3RyX2RldGVjdChwbGF0Zm9ybSwgIkdCIikgfiAiTmludGVuZG8gR2FtZSBCb3kiLA0KICAgIHN0cl9kZXRlY3QocGxhdGZvcm0sICJEUyIpIH4gIk5pbnRlbmRvIERTIiwNCiAgICAuZGVmYXVsdCA9IHBsYXRmb3JtDQogICkpDQpgYGANCg0KYGBge3J9DQpnYW1lX3NhbGVzICU+JSANCiAgZ3JvdXBfYnkocHVibGlzaGVyLCBwbGF0Zm9ybV9jYXQpICU+JSANCiAgc3VtbWFyaXNlKHRvdGFsX2dhbWVzID0gbigpKSAlPiUgDQogIGdncGxvdChhZXMocmVvcmRlcihwdWJsaXNoZXIsIC10b3RhbF9nYW1lcywgc3VtKSwgdG90YWxfZ2FtZXMsIGZpbGwgPSBwbGF0Zm9ybV9jYXQpKSArDQogIGdlb21fY29sKCkgKw0KICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoDQogICAgIlhib3giID0gImRhcmtncmVlbiIsDQogICAgIlBsYXlzdGF0aW9uIiA9ICJibHVlIiwNCiAgICAiTmludGVuZG8gR2FtZWN1YmUiID0gInJlZDEiLA0KICAgICJOaW50ZW5kbyBEUyIgPSAicmVkMiIsDQogICAgIk5pbnRlbmRvIFdpaSIgPSAicmVkMyIsDQogICAgIk5pbnRlbmRvIEdhbWUgQm95IiA9ICJyZWQ0IiwNCiAgICAiUEMiID0gImJsYWNrIikNCiAgKQ0KYGBgDQojIEdhbWVzIGJ5IHB1Ymxpc2hlcg0KYGBge3J9DQpjb2xvdXJfc2NoZW1lIDwtIGMoDQogICJYYm94IiA9ICJkYXJrZ3JlZW4iLA0KICAiUGxheXN0YXRpb24iID0gImJsdWUiLA0KICAiTmludGVuZG8gR2FtZWN1YmUiID0gInJlZDEiLA0KICAiTmludGVuZG8gRFMiID0gInJlZDIiLA0KICAiTmludGVuZG8gV2lpIiA9ICJyZWQzIiwNCiAgIk5pbnRlbmRvIEdhbWUgQm95IiA9ICJyZWQ0IiwNCiAgIlBDIiA9ICJibGFjayIpDQoNCmdhbWVfc2FsZXMgJT4lIA0KICBncm91cF9ieShwdWJsaXNoZXIsIHBsYXRmb3JtX2NhdCkgJT4lIA0KICBzdW1tYXJpc2UodG90YWxfZ2FtZXMgPSBuKCkpICU+JSANCiAgcGxvdF9seSh5ID0gfiByZW9yZGVyKHB1Ymxpc2hlciwgdG90YWxfZ2FtZXMsIHN1bSksDQogICAgICAgICAgeCA9IH4gdG90YWxfZ2FtZXMsDQogICAgICAgICAgY29sb3IgPSB+IHBsYXRmb3JtX2NhdCwNCiAgICAgICAgICBjb2xvcnMgPSBjb2xvdXJfc2NoZW1lLA0KICAgICAgICAgIHR5cGUgPSAiYmFyIg0KICApICU+JSANCiAgbGF5b3V0KGJhcm1vZGUgPSAic3RhY2siLA0KICAgICAgICAgdGl0bGUgPSAiTnVtYmVyIG9mIEdhbWVzIFJlbGVhc2VkIGJ5IFB1Ymxpc2hlciBBY3Jvc3MgRWFjaCBQbGF0Zm9ybSIsDQogICAgICAgICB5YXhpcyA9IGxpc3QodGl0bGUgPSAiIiksDQogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGUgPSAiTnVtYmVyIG9mIEdhbWVzIHJlbGVhc2VkIikNCiAgKQ0KYGBgDQoNCmBgYHtyfQ0KZ2FtZV9zYWxlcyAlPiUgDQogIGZpbHRlcihwdWJsaXNoZXIgPT0gIk1pZHdheSBHYW1lcyIpICU+JSANCiAgZ3JvdXBfYnkoeWVhcl9vZl9yZWxlYXNlKSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9nYW1lcyA9IG4oKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHllYXJfb2ZfcmVsZWFzZSwgdG90YWxfZ2FtZXMpKSArDQogIGdlb21fbGluZSgpICsNCiAgdGhlbWVfY2xhc3NpYygpDQpgYGANCg0KYGBge3J9DQpnYW1lX3NhbGVzIDwtIGdhbWVfc2FsZXMgJT4lIA0KICBtdXRhdGUoDQogICAgcGxhdGZvcm1fY2F0ID0gZmFjdG9yKA0KICAgICAgY2FzZV93aGVuKA0KICAgICAgICBzdHJfZGV0ZWN0KHBsYXRmb3JtLCAiUFMiKSB+ICJQbGF5c3RhdGlvbiIsDQogICAgICAgIHN0cl9kZXRlY3QocGxhdGZvcm0sICJYIikgfiAiWGJveCIsDQogICAgICAgIHN0cl9kZXRlY3QocGxhdGZvcm0sICJXaWl8R0N8R0J8RFMiKSB+ICJOaW50ZW5kbyIsDQogICAgICAgIC5kZWZhdWx0ID0gcGxhdGZvcm0NCiAgICAgICkNCiAgICApDQogICkNCg0KZ2FtZV9zYWxlcyAlPiUgDQogIGZpbHRlcihwdWJsaXNoZXIgPT0gIkFjdGl2aXNpb24iKSAlPiUgDQogIGdyb3VwX2J5KHllYXJfb2ZfcmVsZWFzZSwgcGxhdGZvcm1fY2F0LCAuZHJvcCA9IEZBTFNFKSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbF9nYW1lc19wbGF0ID0gbigpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGdyb3VwX2J5KHllYXJfb2ZfcmVsZWFzZSkgJT4lIA0KICBtdXRhdGUodG90YWxfZ2FtZXMgPSBzdW0odG90YWxfZ2FtZXNfcGxhdCkpICU+JSANCiAgZ2dwbG90KCkgKw0KICBnZW9tX2xpbmUoYWVzKHllYXJfb2ZfcmVsZWFzZSwgdG90YWxfZ2FtZXNfcGxhdCwgY29sb3VyID0gcGxhdGZvcm1fY2F0KSkgKw0KICBnZW9tX3BvaW50KGFlcyh5ZWFyX29mX3JlbGVhc2UsIHRvdGFsX2dhbWVzX3BsYXQsIGNvbG91ciA9IHBsYXRmb3JtX2NhdCkpKw0KICBnZW9tX2xpbmUoYWVzKHllYXJfb2ZfcmVsZWFzZSwgdG90YWxfZ2FtZXMsIGNvbG91ciA9ICJUb3RhbCIpKSArDQogIGdlb21fcG9pbnQoYWVzKHllYXJfb2ZfcmVsZWFzZSwgdG90YWxfZ2FtZXMsIGNvbG91ciA9ICJUb3RhbCIpKSArDQogIHRoZW1lX2NsYXNzaWMoKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCmdhbWVfc2FsZXMgJT4lIA0KICBncm91cF9ieShwbGF0Zm9ybV9jYXQsIHBsYXRmb3JtKSAlPiUgDQogIHN1bW1hcmlzZSh0b3RhbCA9IG4oKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHBsYXRmb3JtX2NhdCwgdG90YWwsIGZpbGwgPSBwbGF0Zm9ybSkpICsNCiAgZ2VvbV9jb2woKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBwbGF0Zm9ybSkpDQpgYGANCg0K